#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <ctime>
#include <vector>


// void *threadrun(void *args)
// {
//     pthread_detach(pthread_self());
//     std::string name = static_cast<const char*>(args);
//     while(true)
//     {
//         std::cout << name << " is running" << std::endl;
//         sleep(3);
//         int *p = nullptr;
//         *p = 100;
//         break;
//     }
//     pthread_exit(args); // 专门终止一个线程的！
// }

// int main()
// {
//     // 问题八：可不可以不让线程被join，执行完自己就退出？
//     pthread_detach(pthread_self());
//     return 0;
// }


// void* threadRun(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     std::cout << "This is new thread, it's name is " << name << std::endl;
//     // exit(1);   
//     sleep(3);
//     pthread_exit(args);
//     // return nullptr;
// }

// int main()
// {
//     // 问题六：如何创建多线程？
//     std::vector<pthread_t> v;
//     for(int i = 0;i < 10; i++)
//     {
//         pthread_t tid;
//         char* name = new char[128];
//         snprintf(name,128,"thread - %d", i);
//         pthread_create(&tid, nullptr, threadRun, (void*)name);
        
//         v.emplace_back(tid);
//     }
//     for(auto e : v)
//     {
//         pthread_join(e, nullptr);
//     }
//     return 0;
// }


// 全面认识线程函数的返回值
// class ThreadResult
// {
// public:
//     bool _result;
// };
// class ThreadData
// {
// public:
//     std::string _name;
// };

// void* threadRun(void* args)
// {
//     ThreadData* t = static_cast<ThreadData*>(args);
//     std::cout << "The new thread is running..., name is " << t->_name << std::endl; 
//     ThreadResult* s = new ThreadResult();
//     s->_result = true;
//     return (void*)s;
// }


// int main()
// {
//     pthread_t tid;
//     ThreadResult* result = nullptr;
//     ThreadData* t = new ThreadData();
//     t->_name = "thread -1";
//     pthread_create(&tid, nullptr, threadRun, (void*)t);
//     pthread_join(tid,(void**)&result);
//     std::cout << "The new thread's result is " << result->_result << std::endl;

//     return 0;
// }



// std::string ToHex(pthread_t& tid)
// {
//     char buffer[128];
//     snprintf(buffer,sizeof(buffer),"0x%lx",tid);
//     return buffer;
// }

// void* threadRun(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     std::cout << "This is new thread, name is " << name << std::endl;

//     return nullptr;
// }


// class ThreadData
// {
// public:
//     std::string _name;
//     int _id;
// };

// void* threadRunClass(void* args)
// {
//     ThreadData t = *(ThreadData*)args;
//     std::cout << "The new thread name is " << t._name << " ,id is " << t._id << std::endl;
//     return nullptr;
// }

// int main()
// {
//     //问题一：主线程和子线程谁先运行？
//     pthread_t tid;
//     void* result;
//     pthread_create(&tid, nullptr, threadRun, (void*)"thread -1");

//     std::cout << "This is main thread ..." << std::endl;

//     // sleep(10);
//     //pthread_join(tid,&result);
    
//     //问题二：主线程和子线程之间，我们期望谁先退出呢？
//     int n = pthread_join(tid, &result);
//     if(n == 0)
//     std::cout << "main thread wait success, new thread begin quit ..." << std::endl;

//     //问题三：tid是什么？
//     std::cout << "tid is : " << ToHex(tid) << std::endl;

//     //问题四：全面看待线程函数传参
//     pthread_t tid1;
//     ThreadData t1;
//     t1._name = "thread -1";
//     t1._id = 1;
//     ThreadData *td = new ThreadData();
//     td->_name = "thread-2";
//     pthread_create(&tid1, nullptr, threadRunClass, (void*)&t1);
//     pthread_create(&tid1, nullptr, threadRunClass, td);
//     pthread_join(tid1,nullptr);

//     return 0;
// }



// int gval = 100;
// void *threadStart(void *args)
// {
//     while (true)
//     {
//         sleep(1);
//         std::cout << "new thread running..." << ", pid: " << getpid() << std::endl;
//         std::cout << "new thread running..." << ", pid: " << getpid()
//                   << ", gval: " << gval << ", &gval: " << &gval << std::endl;
//     }
// }
// int main()
// {
//     srand(time(nullptr));

//     pthread_t tid1;
//     pthread_create(&tid1, nullptr, threadStart, (void *)"thread-new");

//     // pthread_t tid2;
//     // pthread_create(&tid2, nullptr, threadStart, (void *)"thread-new");

//     // pthread_t tid3;
//     // pthread_create(&tid3, nullptr, threadStart, (void *)"thread-new");

//     // 主线程
//     while (true)
//     {
//         std::cout << "main thread running..." << ", pid: " << getpid()
//                   << ", gval: " << gval << ", &gval: " << &gval << std::endl;
//         // std::cout << "main thread running..." << ", pid: " << getpid() << std::endl;
//         gval++;
//         sleep(1);
//     }
//     return 0;
// }